home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1998 / MacHack 1998.toast / Papers / C++ Exceptions / µShell / Core Utilities / SystemIdle.cp < prev    next >
Encoding:
Text File  |  1998-06-21  |  1.9 KB  |  99 lines  |  [TEXT/CWIE]

  1. #include "SystemIdle.h"
  2. #include "TimeUtils.h"
  3. #include <Threads.h>
  4.  
  5. static SystemEventHandlerUPP    gSystemEventHandlerUPP        = nil;
  6. static long                        gSystemEventHandlerRefcon    = nil;
  7. static long                        gWNENestLevel                = 0;
  8. static EventParams*                gEventParams                = nil;
  9. static bool                        gEnableThreading            = false;
  10.  
  11. pascal OSErr InstallSystemEventHandler(
  12.     SystemEventHandlerUPP             handler,
  13.     long                             handlerRefcon,
  14.     EventParamsPtr                    eventParams)
  15. {
  16.     gSystemEventHandlerUPP        = handler;
  17.     gSystemEventHandlerRefcon    = handlerRefcon;
  18.     gEventParams                = eventParams;
  19.     
  20.     return noErr;
  21. }
  22.  
  23. pascal OSErr GetSystemEventHandler(
  24.     SystemEventHandlerUPP*             handler,
  25.     long*                             handlerRefcon)
  26. {
  27.     *handler        = gSystemEventHandlerUPP;
  28.     *handlerRefcon    = gSystemEventHandlerRefcon;
  29.     
  30.     return noErr;
  31. }
  32.  
  33. pascal OSErr SystemIdle(void)
  34. {
  35.     EventParams* parms    = gEventParams;
  36.     OSErr        err        = noErr;
  37.     
  38.     if (parms != nil)
  39.     {
  40.         if (gEnableThreading)
  41.         {
  42.             YieldToAnyThread();
  43.         }
  44.  
  45.         bool gotNull;
  46.         
  47.         if (gSystemEventHandlerUPP)
  48.         {
  49.             gotNull    = XWaitNextEvent(parms->mask, &parms->event, parms->sleep, parms->mouseRgn);
  50.             err        = CallSystemEventHandlerProc(gSystemEventHandlerUPP, &parms->event, &parms->sleep, &parms->mouseRgn, parms->refcon);
  51.         }
  52.         
  53.         if (gotNull && (err == noErr || err == errAEEventNotHandled))
  54.         {
  55.             while (parms->event.what == nullEvent)
  56.             {
  57.                 if (TimeExpired(TickCount(), parms->event.when, parms->event.when + parms->wakeTime))
  58.                 {
  59.                     break;
  60.                 }
  61.                 else
  62.                 {
  63.                     YieldToAnyThread();
  64.                 }
  65.             }
  66.         }
  67.     }
  68.     else if (gEnableThreading)
  69.     {
  70.         YieldToAnyThread();
  71.     }
  72.     else // About all we can do
  73.     {
  74.         SystemTask();
  75.     }
  76.     
  77.     return err;
  78. }
  79.  
  80. pascal Boolean XWaitNextEvent(
  81.     EventMask                 eventMask,
  82.     EventRecord *            theEvent,
  83.     UInt32                     sleep,
  84.     RgnHandle                 mouseRgn)
  85. {
  86.     Boolean result;
  87.  
  88.     if (gWNENestLevel > 0)
  89.     {
  90.         result = false;
  91.     }
  92.     else
  93.     {
  94.         result = WaitNextEvent(eventMask, theEvent, sleep, mouseRgn);
  95.     }
  96.     
  97.     return result;
  98. }
  99.